/*!  
Math.uuid.js (v1.4)  
http://www.broofa.com  
mailto:robert@broofa.com  
   
Copyright (c) 2010 Robert Kieffer  
Dual licensed under the MIT and GPL licenses.  
*/  
    
/*  
 * Generate a random uuid.  
 *  
 * USAGE: Math.uuid(length, radix)  
 *   length - the desired number of characters  
 *   radix  - the number of allowable values for each character.  
 *  
 * EXAMPLES:  
 *   // No arguments  - returns RFC4122, version 4 ID  
 *   >>> Math.uuid()  
 *   "92329D39-6F5C-4520-ABFC-AAB64544E172"  
 *  
 *   // One argument - returns ID of the specified length  
 *   >>> Math.uuid(15)     // 15 character ID (default base=62)  
 *   "VcydxgltxrVZSTV"  
 *  
 *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)  
 *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)  
 *   "01001010"  
 *   >>> Math.uuid(8, 10) // 8 character ID (base=10)  
 *   "47473046"  
 *   >>> Math.uuid(8, 16) // 8 character ID (base=16)  
 *   "098F4D35"  
 */  
(function() {   
  // Private array of chars to use   
  var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');   
    
  Math.uuid = function (len, radix) {   
    var chars = CHARS, uuid = [], i;   
    radix = radix || chars.length;   
    
    if (len) {   
      // Compact form   
      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];   
    } else {   
      // rfc4122, version 4 form   
      var r;   
    
      // rfc4122 requires these characters   
      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';   
      uuid[14] = '4';   
    
      // Fill in random data.  At i==19 set the high bits of clock sequence as   
      // per rfc4122, sec. 4.1.5   
      for (i = 0; i < 36; i++) {   
        if (!uuid[i]) {   
          r = 0 | Math.random()*16;   
          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];   
        }   
      }   
    }   
    
    return uuid.join('');   
  };   
    
  // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance   
  // by minimizing calls to random()   
  Math.uuidFast = function() {   
    var chars = CHARS, uuid = new Array(36), rnd=0, r;   
    for (var i = 0; i < 36; i++) {   
      if (i==8 || i==13 ||  i==18 || i==23) {   
        uuid[i] = '-';   
      } else if (i==14) {   
        uuid[i] = '4';   
      } else {   
        if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;   
        r = rnd & 0xf;   
        rnd = rnd >> 4;   
        uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];   
      }   
    }   
    return uuid.join('');   
  };   
    
  // A more compact, but less performant, RFC4122v4 solution:   
  Math.uuidCompact = function() {   
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {   
      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);   
      return v.toString(16);   
    });   
  };   
})(); 
